IoT and NAT

萬物聯網的困難

我們很習慣地透過網址瀏覽常見的新聞網站,或是從影音平台上觀看最新流行的音樂錄影帶。這中間一連串的過程不外是透過 DNS 伺服器將網址轉換成 IP 地址後再連線至該伺服器。也就是說只要知道一台提供服務的公用伺服器 IP 地址,我們便可以連線至該伺服器取得服務。

隨著網際網路逐漸盛行,全世界連上網路的裝置愈來愈多,伴隨著 IPv4 地址日漸短少,於是在 1990 年代中期,NAT (Network Address Traversal,網路地址轉換)作為解決 IPv4 短缺而保留 IP 地址所產出的解決方案。這種技術是一種在 IP 封包通過路由器或防火牆時重寫來源 IP 地址或目的 IP 地址,普遍用在擁有多台主機,但卻只通過一個公有 IP 地址訪問網路網路的私有網路,該技術大幅降低了對 IPv4 地址的需求,但也產生了另一個問題:NAT 穿透問題。

NAT 穿透問題也就是位於 NAT 內部的私有網路得以透過 NAT 技術訪問外部公有 IP 地址,但外部網路卻無法輕易訪問位於 NAT 內部私有網路的裝置,換句話說,若是手上的任一裝置在 NAT 的另一端時,必須克服 NAT 穿透的問題,方得能連線至該裝置,也就是說要萬物聯網,首先也必須克服 NAT 穿透問題。

NAT 的種類

我們知道 NAT 技術作用在路由器上,用作私、公有地址轉換以及通訊埠(Port)的映射(Mapping),NAT 技術可以分為幾種類型:

  • 完全圓錐型(Full cone NAT)
  • 受限圓錐型(Address-restricted cone NAT)
  • 通訊埠受限圓錐型(Port-restricted cone NAT)
  • 對稱型(Symmetric NAT)

完全圓錐型(Full cone NAT)

一個內部 IP 地址(iAddr:Port1)透過 NAT 映射到外部地址(eAddr:Port2)並綁定,所有發自 iAddr:Port1 的封包都經由 eAddr:Port2 向外發送。任意外部主機都能通過 eAddr:Port2 發送封包至 iAddr:Port1,也就是說 NAT 做單純地做了位址轉換,並未對進出的封包做出限制。

以下圖為例,一個 Client 的 IP 地址 (192.168.0.100: 12345 ),透過 NAT 映射到外部地址(203.66.100.210:23456)並綁定,在 Client 中透過 Port 12345 向外發送的封包都藉由 NAT 的 Port 23456 往外發送。任何外部主機如 Server 2可透過 IP 地址(203.66.100.210:23456)發送封包至 Client(192.168.0.100:12345)。

完全圓錐型 NAT

受限圓錐型(Address-restricted cone NAT)

一個內部 IP 地址(iAddr:Port1)透過 NAT 映射到外部地址(eAddr:Port2)並綁定,所有發自 iAddr:Port1 的封包都經由 eAddr:Port2 向外發送,曾經收到來自 eAddr2:Port2 發送封包的任一主機都能通過 eAddr:Port2 發送封包至 iAddr:Port1。換言之,NAT 會記住目的端的 IP 地址,從其他地址進來的封包會被 NAT 阻擋。

以下圖為例,一個 Client 的 IP 地址(192.168.0.100:12345),透過 NAT 映射到外部地址(203.66.100.210:23456),在Client 中透過 Port 12345 向外發送的封包都藉由 NAT 的 Port 23456 往外發送,曾經收到來自 203.66.100.210:23456 發送封包的主機如 Server 1 都能通過 203.66.100.210:23456 發送封包至 Client(192.168.0.100:12345);由於 203.66.100.210:23456 並沒有發送封包給 Server 2,因此 Server 2 無法透過 203.66.100.210:23456 發送封包給 Client。

受限圓錐型 NAT

通訊埠受限圓錐型(Port-restricted cone NAT)

類似於受限圓錐型 NAT(Address-restricted cone NAT),但多了通訊埠的限制,也就是說 NAT 會記住目的端的 IP 地址及通訊埠,只有該目的端的 IP 地址及通訊埠才能傳送封包給發送端。

以下圖為例,Client 透過 NAT 將封包發送 Server 1 的 Port 10000,在 Port-restricted cone NAT 的環境下,只有 Server 1 的 Port 10000 能夠透過 203.66.100.210:23456 發送封包給 Client(192.168.0.100:12345)。

通訊埠受限圓錐型 NAT

對稱型(Symmetric NAT)

與前三項 NAT 類型皆不同,對稱型 NAT 在同一內部地址與通訊埠到一個特定目的地址與通訊埠,都會在 NAT 映射一個獨特的外部地址及通訊埠,在 NAT 內一個內部地址(IP_ADDR:PORT)如發往不同目的地,都會對應到不同的外部地址(IP_ADDR:PORT)。也就是說,只有曾收到過內部主機封包的外部主機,才能發回封包。

以下圖為例,Client 向 Server 1發送封包,會在 Symmetric NAT 中映射一個地址 203.66.100.210:23456,Server 1 可透過 203.66.100.210:23456 傳送封包至 Client 的內部地址 192.168.0.100:12345。另 Client 向 Server 3 的 Port 34567傳送封包,因為 Symmetric NAT 的特性,會在 Symmetric NAT 中映射一個新的地址 203.66.100.210:24567,Server 3 可利用 Port 34567 透過 203.66.100.210:23456 向 Client 192.168.0.100:13456 發送封包,而 Server 3 無法利用另一個通訊埠(如 Port 39876)向 Client 發送封包。最後,Server 2 因為從未接收到 Client 傳來的封包,因此無法發送封包給Client。

對稱型 NAT

連線至另一端

一個透過 NAT 連線上網的裝置,會因為 NAT 加上的限制,而無法再與另一端位於 NAT 內部的裝置建立連線,於是 NAT 穿透(NAT Traversal)便成為萬物聯網要克服的重要課題之一。發展至今,穿透 NAT 的技術方法主要仍基於幾個概念:

  • 位於 NAT 內部的裝置,向一個位於公有 IP 地址的伺服器發出請求,請其告知裝置本身的公有 IP 地址及通訊埠。
  • 位於 NAT 內部的裝置,向一個位於公有 IP 地址的伺服器發出請求,請其協助與欲連線的對端裝置建立連線,或請協助傳遞封包。

目前基於上述概念已發展出幾種常用的幾種 NAT 穿透方法:

  • UPnP (Universal Plug and Play)
  • STUN (Simple Traversal of UDP Through Network Address Translators)
  • TURN (Traversal Using Relay NAT)
  • ALG (Application Layer Gateway)
  • ICE (Interactive Connectivity Establishment)

參考資料:https://zh.wikipedia.org/wiki/网络地址转换